Programmable digital signal processors (DSPs) often use multiple data memory banks to facilitate the exploitation of parallelism in accessing operands from memory. To utilize this capability, however, the data must be properly partitioned and distributed among different memory banks.
To illustrate the importance of data partitioning on execution performance, consider an N.sup.th order FIR (finite impulse response) filter algorithm executed by a hypothetical DSP similar to the Motorola DSP560001. This hypothetical DSP has two data-memory banks that can each be accessed once every clock cycle. But to fetch the elements of arrays A (the data) and B (the filter coefficients) in parallel, the arrays must be stored in separate memory banks. Conversely, if the arrays are stored in the same memory bank, the elements of the arrays would have to be fetched sequentially, and the execution of the code would be slowed down. The ability to access multiple memory banks in parallel with other operations is fundamental to most DSPs. However, failure to properly distribute the data among the memory banks can limit the exploitation of such parallelism and can therefore degrade execution performance.
Data partitioning is currently performed manually by the programmer, who must typically resort to the use of assembler directives or compiler pragmas to control the partitioning of data in a program. As programs become larger and more sophisticated, it becomes very difficult to partition data manually and to ensure that the partitioning results in optimal execution performance. Automatic data partitioning is therefore becoming a necessity, especially with the current trend towards a heavier reliance on high-level languages to program DSPs. Automatic data partitioning relieves the programmer from this task and helps improve performance across an entire program.